package com.linzm.leetcode.primary.哈希表.两个数组的交集;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author zimingl
 * @Date 2022/10/6 23:52
 * @Description: TODO
 */
public class 哈希表454四数相加II {

    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        int temp;
        int res = 0;
        //统计两个数组中的元素之和，同时统计出现的次数，放入map
        for (int i : nums1) {
            for (int j : nums2) {
                temp = i + j;
                if (map.containsKey(temp)) {
                    map.put(temp, map.get(temp) + 1);
                } else {
                    map.put(temp, 1);
                }
            }
        }
        //统计剩余的两个元素的和，在map中找是否存在相加为0的情况，同时记录次数
        for (int i : nums3) {
            for (int j : nums4) {
                temp = i + j;
                if (map.containsKey(0 - temp)) {
                    res += map.get(0 - temp);
                }
            }
        }
        return res;
    }

    @Test
    public void test(){
        int[] nums1 =  {1,2}, nums2 = {-2,-1}, nums3 = {-1,2}, nums4 = {0,2};
        fourSumCount(nums1, nums2, nums3, nums4);
    }

    public int fourSumCount2(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i: nums1){
            for (int j: nums2){
                int temp = i + j;
                if (map.containsKey(temp)){
                    map.put(temp, map.get(temp) + 1);
                } else {
                    map.put(temp, 1);
                }
            }
        }

        int res = 0;
        for(int i: nums3){
            for (int j: nums4){
                int temp = i + j;
                if (map.containsKey(0 - temp)) { // 负数 比如上面有1， 这里有-1
                    res += map.get(0-temp);
                }
            }
        }
        return res;
    }

}
